home *** CD-ROM | disk | FTP | other *** search
- Image Manipulation by Convolution
-
- Several months ago, some work of mine required me to learn a little about
- image processing. The project led to a dead end, but not before a
- particularly interesting image manipulation algorithm had come to my
- attention. The algorithm is called convolution and is capable of finding
- edges, horizontal lines, vertical lines, and even diagonal lines in an image.
-
- Convolution is a fancy word for a reasonably simple process. The underlying
- philosophy of convolution is that when analyzing a picture, we interpret
- pixels in terms of how they fit with their neighbors, rather than as little
- specs of color. What this translates into in the computer world is an image
- whose pixels represent some function of their original neighbors. This is all
- fine and dandy, but still a little hard to code, even in C, until the
- following pseudocode becomes apparent:
-
- For every pixel in the original image:
-
- Place a pixel on the new image whose color is a function of the colors of the
- original pixel's neighbors.
-
- Keep going until the original image has been completely "convolved" into the
- new image.
-
- Well, this certainly sounds reasonable to code. Now, what function of the
- original neighbors do we choose? One of the simplest functions turns out to
- be one of the best: a weighted sum, including the original pixel. Let's
- look at a simple 1D example:
-
- Consider the row of pixels (1 2 3 4), with the pixel colored (2) being the
- pixel of interest. Assume we have a "convolution matrix" of (-5 0 6). The
- new pixel's color will be (1)(-5)+(2)(0)+(3)(6) or (13). The convolved value
- for the original pixel colored (3) will be (2)(-5)+(3)(0)+(4)(6) or (14). The
- two end pixels of (1) and (4) cannot be convolved since there are no left or
- right points to apply the convolution matrix to, and are assigned a value of
- (0). The new row of pixels now looks like (0 13 14 0).
-
- The 2D case is similar, involving 2D regions of pixels and a 2D convolution
- matrix.
-
-
- Choosing a Convolution matrix
-
-
- The convolution matrix you choose determines what the final picture will look
- like. The program in Listing 1 accepts a file named matrix.dat that has the
- following format:
-
- <matrix width> <matrix height>
- <row 1,col 1 factor> ... <row 1,col w factor>
- ... ... ...
- <row h,col 1 factor> ... <row h,col w factor>
-
- Note that both the width and height must be odd, as the matrix needs to have a
- center point.
-
- Some sample matrices will give you a feel for what convolution can do. For
- example, the matrix file of:
-
- 3 3
- -1 0 1
- -1 0 1
- -1 0 1
-
- will generate pixels only on the edge of a dark-to-light transition going
- left-to-right on the screen. Reversing the 1's and -1's will generate pixels
- on the edge of a light-to-dark transition (i.e. the "right" side of an
- object). Likewise, the matrix file of:
-
- 3 3
- 1 1 1
- 0 0 0
- -1 -1 -1
-
- will generate pixels only on the edge of a dark-to-light transition going from
- top to bottom of the screen. Switching the 1's and -1's here allows for the
- detection of topside lines. To generate a picture that consists of only the
- edges of objects, use the matrix file of:
-
- 3 3
- -1 -1 -1
- -1 8 -1
- -1 -1 -1
-
- Diagonal lines can be detected by using matrices like:
-
- 3 3
- 0 1 0
- -1 0 1
- 0 -1 0
-
- In choosing your own matrix, follow these simple rules for best results:
- 1) Make sure the factors in the matrix add up to zero or more. A zero sum
- will help to eliminate extraneous pixels, while a small net positive sum can
- help fill in missing pixels. A negative sum usually filters out too many
- pixels (especially on a monochrome screen).
- 2) Use a zero in matrix locations where you don't care what is in that spot.
- 3) Use negative numbers for locations that you strongly desire not to have any
- color.
- 4) Use positive numbers for locations that you strongly desire to have a non-
- zero value.
-
-
- The program
-
-
- The program in Listing 1 accepts images in the CUT file format used by the
- Dr.Halo products. I use a hand scanner for acquiring images and this was the
- format that was easiest to use, however, you can substitute any other means of
- getting a picture onto the screen. If you should replace the present routine
- for loading images (load_cut(...)), be sure to set the global variables minx,
- miny, maxx, maxy to the image's location on the screen but do not change the
- display page. To keep the convolution code reasonably clean, the program
- also requires that you leave at least <matrix height+1>/2 and <matrix width+1
- >/2 gap on the top and left side of the image respectively.
-
- The program was written in Turbo C 2.0 and the graphics calls should be fairly
- portable to other C's. Pointers are used frequently to minimize the time that
- several hundred thousand array accesses would normally take. Though somewhat
- optimized, the program could still use a good kick, perhaps by forcing it to
- ignore matrix entries of zero.
-
- When run, the program asks for the name of a CUT file to load and some
- information about image cleanup. Enter the path to the file, if the file is
- not in the same directory, and the name of the file (including the .CUT on the
- end). The image cleanup option will let the computer delete stray pixels
- before convolution. A single pixel with zero neighbors usually does not
- belong to a surface of interest and can be deleted before convolution by
- answering 0 at the cleanup prompt. The cleanup process is disabled by a
- response of -1.
-
- Once the image has been convolved, press the space bar to flip between the
- original image (or cleaned image) and the convolved image. The effects of
- convolution become very apparent by just holding down the space bar! Should
- you be fortunate enough to be using the program on a color system, you can
- toggle colors by pressing the letters A-P (A=black, B=blue, etc...). Finally,
- the ESC key will get you out (as will pressing any key during convolution).
-
-
- Conclusion
-
-
- The program works fine now, though you may wish to consider working on a
- method of saving convolved images, further optimization (assembly?) of the
- convolution routine, and the use of other image file formats.
-
- Convolution is an amazingly straight forward algorithm for image manipulation
- and can serve as the starting point for AI programs, contour analysis, image
- recognition, etc. I hope you find it as interesting as I did.